#ifndef IRENDERQUEUE_H_INCLUDED
#define IRENDERQUEUE_H_INCLUDED

/// Predefinitions
/* The predefined classes that are listed below are required so the IRenderQueue could function.
	All these are, of course, abstract and can be overrided at any time. */
class IInstance;		/// This class will function as holder and modifier of transformation. It will refer to a DATAH (IRenderable or IObject, for example), so it could be used as is
class IRenderable;	/// This class will function as a holder of renderable data. Data that can be drawn on the screen. Will contain collision data for models, geometry, light properties, IEffect, IShader, and whatnot (all as DATAH).
class IRenderTarget;	/// This class will function as a surface desciptor. It will contain IRenderQueue like the following one so it could stack and then execute the stacked renderables in optimized order.

/*  ###  ##### ##  ## ####	  ##### ####      	  ##	  ##  ## ##### ##  ## #####
// ## ## ##    ### ## ##  ## ##    ## ##			##  ##  ##  ## ##    ##  ## ##
// ####  ####  ###### ##  ## ####  ####			##  ##  ##  ## ####  ##  ## ####
// ## ## ##    ## ### ##  ## ##    ## ##			## ###  ##  ## ##    ##  ## ##
// ## ## ##### ##  ## #####  ##### ## ##			  ## ##  ####  #####  ####  #####  */

/// The abstract render queue mechanism
class IRenderQueue {
	private:

	public:
		// Public functions:
		virtual void	Process			( IRenderTarget* rt ) = 0;
		virtual void	ProcessAndKeep	( IRenderTarget* rt ) = 0;
		virtual void	Enqueue			( IInstance* 	instance, IRenderable* renderable ) = 0;
		virtual void	Enqueue			( IInstance* 	instance 	) = 0;
		virtual void	Enqueue			( IRenderable* renderable 	) = 0;
		virtual void	Clear				( ) = 0;
		virtual void	Sort				( ) = 0;

					// Constructor & Destructor
					IRenderQueue( ) { }
		virtual ~IRenderQueue( ) { }
};



#endif // IRENDERQUEUE_H_INCLUDED
